package com.aliyun.messagemgt.util;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/**
 * @author byp
 * @date 2020/7/20
 */
public class SmsQuotaDateUtils {

    private static final String FORMAT_TIME = "yyyy-MM-dd HH:mm:ss";

    private static final String FORMAT_DAY = "yyyy-MM-dd";

    private static final String FORMAT_MONTH = "yyyy-MM";

    /**
     * 获取去年年份
     *
     * @return String
     */
    public static String lastYear() {
        Calendar cal = Calendar.getInstance();
        int year = cal.get(Calendar.YEAR);
        return String.valueOf(year - 1);
    }

    /**
     * 通过传入的时间，获取去年年份
     *
     * @param date 日期
     * @return String
     */
    public static String lastYear(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        int year = cal.get(Calendar.YEAR);
        return String.valueOf(year - 1);
    }

    /**
     * 获取上月 月份
     *
     * @return String
     */
    public static String lastMonth() {
        Calendar cal = Calendar.getInstance();
        int lastMonth = cal.get(Calendar.MONTH);
        if (lastMonth == 0) {
            lastMonth = 12;
        }
        return String.valueOf(lastMonth);
    }

    /**
     * 根据传入的日期获取上月月份
     *
     * @param date date
     * @return String
     */
    public static String lastMonth(Date date) {
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        int lastMonth = cal.get(Calendar.MONTH);
        if (lastMonth == 0) {
            lastMonth = 12;
        }
        return String.valueOf(lastMonth);
    }

    /**
     * 获取当前年份
     *
     * @return String类型年份
     */
    public static String currentYear() {
        Calendar cal = Calendar.getInstance();
        int year = cal.get(Calendar.YEAR);
        return String.valueOf(year);
    }

    /**
     * 获取当前年份
     *
     * @return int
     */
    private static int currentIntYear() {
        Calendar cal = Calendar.getInstance();
        return cal.get(Calendar.YEAR);
    }

    /**
     * 获取当前月份
     *
     * @return String类型月份
     */
    public static String currentMonth() {
        Calendar cal = Calendar.getInstance();
        int month = cal.get(Calendar.MONTH) + 1;
        return String.valueOf(month);
    }

    /**
     * 获取当前月份
     *
     * @return int类型月份
     */
    public static int currentIntMonth() {
        Calendar cal = Calendar.getInstance();
        return cal.get(Calendar.MONTH) + 1;
    }

    /**
     * 获取当前月份最后一天 23:59:59
     *
     * @return date
     */
    public static Date currentMonthLastDay() {
        Calendar cal = Calendar.getInstance();
        int maxDate = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
        cal.set(Calendar.DATE, maxDate);
        //将小时至0
        cal.set(Calendar.HOUR_OF_DAY, 23);
        //将分钟至0
        cal.set(Calendar.MINUTE, 59);
        //将秒至0
        cal.set(Calendar.SECOND, 59);
        return cal.getTime();
    }

    /**
     * 获取下个月第一天 00:00:00
     *
     * @return date
     */
    public static Date nextMonthFirstDay() {
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.MONTH, 1);
        cal.set(Calendar.DAY_OF_MONTH, 1);
        //将小时至0
        cal.set(Calendar.HOUR_OF_DAY, 0);
        //将分钟至0
        cal.set(Calendar.MINUTE, 0);
        //将秒至0
        cal.set(Calendar.SECOND, 0);
        //将毫秒至0
        cal.set(Calendar.MILLISECOND, 0);
        return cal.getTime();
    }

    /**
     * 获取当前年最后一天
     *
     * @return date
     */
    public static Date currentYearLastDay() {
        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.MONTH, cal.getActualMaximum(Calendar.MONTH));
        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
        cal.set(Calendar.HOUR_OF_DAY, 23);
        //将分钟至0
        cal.set(Calendar.MINUTE, 59);
        //将秒至0
        cal.set(Calendar.SECOND, 59);
        return cal.getTime();
    }

    /**
     * 获取次年第一天
     *
     * @return date
     */
    public static Date nextYearFirstDay() {
        Calendar cal = Calendar.getInstance();
        //设置为1月
        cal.set(Calendar.MONTH, Calendar.JANUARY);
        //设置为1号
        cal.set(Calendar.DAY_OF_MONTH, 1);
        //将小时至0
        cal.set(Calendar.HOUR_OF_DAY, 0);
        //将分钟至0
        cal.set(Calendar.MINUTE, 0);
        //将秒至0
        cal.set(Calendar.SECOND, 0);
        //将毫秒至0
        cal.set(Calendar.MILLISECOND, 0);
        //增加一年
        cal.add(Calendar.YEAR, 1);
        return cal.getTime();
    }

    public static String dateFormatDay(Date date) {
        if (date == null) {
            return null;
        }
        SimpleDateFormat sdf = new SimpleDateFormat(FORMAT_DAY);
        return sdf.format(date);
    }

    public static String dateFormatMonth(Date date) {
        if (date == null) {
            return null;
        }
        SimpleDateFormat sdf = new SimpleDateFormat(FORMAT_MONTH);
        return sdf.format(date);
    }

    /**
     * 格式化明天 yyyy-MM-dd
     *
     * @return yyyy-MM-dd
     */
    public static String tomorrowFormat(Date date) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        calendar.add(Calendar.DATE, +1);
        SimpleDateFormat sdf = new SimpleDateFormat(FORMAT_DAY);
        return sdf.format(calendar.getTime());
    }

    /**
     * 获取当前日期前15天的日期
     *
     * @return string yyyy-MM-dd
     */
    public static String before15Day() {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.DATE, -14);
        SimpleDateFormat sdf = new SimpleDateFormat(FORMAT_DAY);
        return sdf.format(calendar.getTime());
    }

    /**
     * 获取当前日期前30天的日期
     *
     * @return string yyyy-MM-dd
     */
    public static String before30Day() {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.DATE, -29);
        SimpleDateFormat sdf = new SimpleDateFormat(FORMAT_DAY);
        return sdf.format(calendar.getTime());
    }

    /**
     * 获取当前日期前12个月的1号日期
     *
     * @return yyyy-MM-dd
     */
    public static String before12MonthDay() {
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(new Date());
        calendar.add(Calendar.MONTH, -11);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        SimpleDateFormat sdf = new SimpleDateFormat(FORMAT_DAY);
        return sdf.format(calendar.getTime());
    }

    /**
     * 计算两日期相差天数
     * 这里就算日期包含起止时间[begin,end] 日期格式为yyyy-MM-dd HH:mm:ss 如果为yyyy-MM-dd结果会有误差
     *
     * @param before 早日期
     * @param end    晚日期
     * @return 天数
     */
    public static int diffDays(Date before, Date end) {
        Calendar beginCalendar = Calendar.getInstance();
        beginCalendar.setTime(before);
        Calendar endCalendar = Calendar.getInstance();
        endCalendar.setTime(end);
        long beginTime = beginCalendar.getTime().getTime();
        long endTime = endCalendar.getTime().getTime();
        int betweenDays = (int) ((endTime - beginTime) / (1000 * 60 * 60 * 24));
        endCalendar.add(Calendar.DAY_OF_MONTH, -betweenDays);
        endCalendar.add(Calendar.DAY_OF_MONTH, -1);
        if (beginCalendar.get(Calendar.DAY_OF_MONTH) == endCalendar.get(Calendar.DAY_OF_MONTH)) {
            return betweenDays + 2;
        } else {
            return betweenDays + 1;
        }
    }

    /**
     * 计算两个日期相差月份
     *
     * @param before 早日期
     * @param end    晚日期
     * @return 月份差值
     */
    public static int diffMonths(Date before, Date end) {
        Calendar startTime = Calendar.getInstance();
        Calendar endTime = Calendar.getInstance();
        startTime.setTime(before);
        endTime.setTime(end);
        int result = endTime.get(Calendar.MONTH) - startTime.get(Calendar.MONTH) + 1;
        int month = (endTime.get(Calendar.YEAR) - startTime.get(Calendar.YEAR)) * 12;
        return Math.abs(month + result);
    }

}
